/**
 * 二叉树结点构造函数
 * @param {*} data 节点值
 * @param {TreeNode} left 左孩子
 * @param {TreeNode} right 右孩子
 * @param {TreeNode} parent 双亲结点
 */
function TreeNode(data, left, right, parent) {
	this.data = data;
	this.left = left;
	this.right = right;
	this.parent = parent;
}

/**
 * 二叉树先序遍历-递归部分
 * @param {TreeNode} root 二叉树根节点
 * @param {Array} result 储存结果的数组
 */
function preorderTraversal(root, result) {
	if (root != null) {
		// 先访问根节点存放到结果中
		result.push(root.data);
		// 然后递归先序遍历左子树
		preorderTraversal(root.left, result);
		// 最后递归先序遍历右子树
		preorderTraversal(root.right, result);
	}
}

/**
 * 二叉树中序遍历-递归部分
 * @param {TreeNode} root 二叉树根节点
 * @param {Array} result 储存结果的数组
 */
function inorderTraversal(root, result) {
	if (root != null) {
		// 先递归中序遍历左子树
		inorderTraversal(root.left, result);
		// 然后访问根节点存放到结果中
		result.push(root.data);
		// 最后递归中序遍历右子树
		inorderTraversal(root.right, result);
	}
}

/**
 * 二叉树后序遍历-递归部分
 * @param {TreeNode} root 二叉树根节点
 * @param {Array} result 储存结果的数组
 */
function postorderTraversal(root, result) {
	if (root != null) {
		// 先递归先序遍历左子树
		postorderTraversal(root.left, result);
		// 然后递归先序遍历右子树
		postorderTraversal(root.right, result);
		// 最后访问根节点存放到结果中
		result.push(root.data);
	}
}

/**
 * 二叉树构造函数
 * @param {TreeNode} root 二叉树根节点
 */
function BinaryTree(root) {
	this.root = root;
	/**
	 * 先序遍历二叉树-启动部分
	 * @returns 自身先序遍历结果
	 */
	this.preorderTraversal = () => {
		let result = new Array();
		preorderTraversal(this.root, result);
		return result;
	}
	/**
	 * 中序遍历二叉树-启动部分
	 * @returns 自身中序遍历结果
	 */
	this.inorderTraversal = () => {
		let result = new Array();
		inorderTraversal(this.root, result);
		return result;
	}
	/**
	 * 后序遍历二叉树-启动部分
	 * @returns 自身后序遍历结果
	 */
	this.postorderTraversal = () => {
		let result = new Array();
		postorderTraversal(this.root, result);
		return result;
	}
}

export {
	TreeNode,
	BinaryTree
};

/*
// 测试一下
// 构造一个二叉树
let tree = new BinaryTree(new TreeNode('A', new TreeNode('B', new TreeNode('D', new TreeNode('F', null, null)), new TreeNode('E', null, null)), new TreeNode('C', new TreeNode('H', null, null), new TreeNode('G', new TreeNode('I', null, null), null))));
// 先序遍历
console.log('先序遍历：' + tree.preorderTraversal());
// 中序遍历
console.log('中序遍历：' + tree.inorderTraversal());
// 后序遍历
console.log('后序遍历：' + tree.postorderTraversal());
*/